import { apiAndPCType, apiType, Box3Get, escapeHtml } from "@ap/util/request";
import * as vscode from "vscode";
import {
  showErrorMessage,
  showInformationMessage,
} from "@ap/util/vscode/message";
import { getPackageJson } from "@ap/util/packageJson";
import { arenaErrorMsg } from "@ap/util/vscode/errorMsg";
import type { PackageConfig } from "@ap/types/config";

/**
 * 扩展的快速选择项接口，包含URL属性。
 */
interface ExtendedQuickPickItem extends vscode.QuickPickItem {
  url?: string;
}

// 存储快速选择项的数组。
let items: ExtendedQuickPickItem[];

/**
 * 异步获取Box3游戏地图信息。
 * @returns 返回一个Promise，解析为ExtendedQuickPickItem数组或null。
 */
async function getBox3PlayMap(): Promise<ExtendedQuickPickItem[] | undefined> {
  // 从package.json中获取地图配置。
  const arenaProMapConfig = await getPackageJson<PackageConfig["map"]>("map");
  // 如果没有配置或没有id，显示错误消息并返回null。
  if (!arenaProMapConfig || !arenaProMapConfig.id) {
    showErrorMessage(arenaErrorMsg.CONFIGURE_MAP_ID);
    return;
  }

  // 使用id获取地图详细信息。
  const response = await Box3Get(
    {
      url: "content/detail/" + arenaProMapConfig.id,
    },
    "游玩地图数据",
  );

  // 如果响应不成功，显示错误消息并返回null。
  if (!response || response.code !== 200) {
    showErrorMessage(`获取游玩地图失败: ${response?.msg}`);
    return;
  }

  // 初始化items数组，并填充地图相关信息。
  items = [];
  items.push(
    {
      label: `$(debug-breakpoint-log) ${escapeHtml(response.data.name)}`,
      description: "地图名称",
      detail: `${escapeHtml(response.data.description)}`,
      url:
        apiAndPCType[apiType].pc +
        "exp/experience/detail/" +
        response.data.contentId.toString(),
    },
    {
      label: `$(getting-started-beginner) ${escapeHtml(response.data.publishedAt)} / V${response.data.publishedVersion.toString()}`,
      description: "更新说明/时间/版本",
      detail: `${escapeHtml(response.data.notice)}`,
    },
    {
      label: `基本数据`,
      kind: vscode.QuickPickItemKind.Separator,
    },
    {
      label: `$(eye) ${(response.data.viewCount / 1000).toFixed(2)}K`,
      description: "浏览量",
    },
    {
      label: `$(notebook-execute-all) ${(response.data.playCount / 1000).toFixed(2)}K`,
      description: "游玩量",
    },
    {
      label: `$(remote-explorer-get-started) ${response.data.likeCount.toString()}`,
      description: "点赞",
    },
    {
      label: `$(pin) ${response.data.favoritesCount.toString()}`,
      description: "收藏",
    },
    {
      label: `$(comments-view-icon) ${response.data.commentCount.toString()}`,
      description: "评论",
    },
    {
      label: `图主`,
      kind: vscode.QuickPickItemKind.Separator,
    },
    {
      label: `${escapeHtml(response.data.author.nickname)}(${response.data.author.authorId.toString()})`,
      url:
        apiAndPCType[apiType].pc +
        "profile/" +
        response.data.author.authorId.toString(),
    },
    {
      label: `合作者`,
      kind: vscode.QuickPickItemKind.Separator,
    },
  );

  // 遍历合作者列表，添加到items数组。
  for (const value of response.data.coAuthors) {
    items.push({
      label: `${escapeHtml(value.nickname)}(${value.userId.toString()})`,
      url: apiAndPCType[apiType].pc + "profile/" + value.userId.toString(),
    });
  }
  return items;
}

/**
 * 异步选择Box3游戏地图。
 */
export default async function selectBox3PlayMap() {
  try {
    // 获取地图列表。
    const dataSource = await getBox3PlayMap();
    // 如果数据源为空，直接返回。
    if (!dataSource) {
      return "获取失败";
    }
    // 显示快速选择菜单，并处理选择项。
    const selectedOption = await vscode.window.showQuickPick(dataSource, {
      title: "ArenaPro：项目地图游玩数据",
      matchOnDescription: true,
      canPickMany: false,
    });
    // 如果选择项包含URL，打开URL。
    if (selectedOption?.url) {
      vscode.env.openExternal(vscode.Uri.parse(selectedOption.url));
    }
    return dataSource;
  } catch (error) {
    // 捕获并显示选择操作中的错误。
    showErrorMessage(`选择操作遇到错误: ${error}`);
    return error;
  }
}
